package com.yqh.controller;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.github.pagehelper.PageInfo;
import com.yqh.Result;
import com.yqh.dto.ProductSearchDTO;
import com.yqh.entity.Product;
import com.yqh.exception.CustomException;
import com.yqh.service.ProductService;
import com.yqh.vo.ProductSearchVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.*;


/**
 * 商品模块
 *
 * @author 阳秋豪
 * @createTime 2024/3/22
 */
@CrossOrigin
@RestController
@RequestMapping("/product")
public class ProductController {
    @Autowired
    private ProductService productService;

    // todo 被 getSearchProduct（商品分页查询）方法取代

    /**
     * 查询所有商品
     */
    @GetMapping
    private Result getAllProduct() {
        List<Product> productList = productService.getAllProduct();
        return Result.success(productList);
    }

    /**
     * 商品分页查询
     *
     * @param productSearchDTO 条件查询参数及分页查询参数
     * @return 包含分页结果的商品信息
     */
    @GetMapping("/search")
    private Result getSearchProduct(ProductSearchDTO productSearchDTO) {
        PageInfo<ProductSearchVO> productPageInfo = productService.getSearchProduct(productSearchDTO);
        return Result.success(productPageInfo);
    }

    /**
     * 添加商品
     *
     * @param product 商品信息
     * @return 成功
     */
    @PostMapping("/add")
    private Result addProduct(@RequestBody Product product) {
        productService.addProduct(product);
        return Result.success();
    }

    /**
     * 编辑商品
     *
     * @param product 商品信息
     * @return 成功
     */
    @PostMapping("/alter")
    private Result alterProduct(@RequestBody Product product) {
        productService.alterProduct(product);
        return Result.success();
    }

    /**
     * 删除商品
     *
     * @param productId
     * @return 成功
     */
    @DeleteMapping("/delete/{productId}")
    private Result deleteProduct(@PathVariable Integer productId) {
        productService.deleteProduct(productId);
        return Result.success();
    }

    /**
     * 批量删除商品
     *
     * @param productList 前端选中要删除的商品集合
     * @return 成功
     */
    @PostMapping("/deleteBatch")
    private Result deleteBatch(@RequestBody List<Product> productList) {
        productList.forEach(product -> productService.deleteProduct(product.getProductId()));
        return Result.success();
    }

    /**
     * 批量导出商品到 excel
     *
     * @param response 响应信息
     * @return 成功
     * @throws IOException IO 异常
     */
    @GetMapping("/expReport")
    private Result expReport(HttpServletResponse response) throws IOException {
        // 1. 从数据库中查询出所有数据
        List<Product> allProduct = productService.getAllProduct();
        if (CollectionUtil.isEmpty(allProduct)) {
            throw new CustomException("未找到数据");
        }
        // 2. 定义一个 List 出来，存储处理之后的数据，用于塞到 list 中
        List<Map<String, Object>> list = new ArrayList<>(allProduct.size());
        // 3. 定义一个 Map<key,value> 出来，遍历每一条数据，然后封装到 Map<key,value> 中，把这个 map 塞到 list 中
        for (Product product : allProduct) {
            Map<String, Object> row = new HashMap<>();
            row.put("商品编号", product.getProductId());
            row.put("商品名称", product.getProductName());
            row.put("商品图片", product.getProductImage());
            row.put("商品描述", product.getProductDescription());
            row.put("商品售价", product.getProductPrice());
            row.put("商品状态", product.getProductStatus());
            row.put("商品库存", product.getProductQuantity());
            row.put("商品分类", product.getProductCategoryId());
            row.put("创建时间", product.getCreatedTime());
            row.put("更新时间", product.getUpdatedTime());
            list.add(row);
        }
        // 4. 创建一个 ExcelWriter ，把 list 数据用这个 writer 生成出来
        ExcelWriter writer = ExcelUtil.getWriter(true);
        writer.write(list, true);
        // 5. 把这个 Excel 下载出来
        // response为 HttpServletResponse 对象
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        // test.xls 是弹出下载对话框的文件名，不能为中文，中文请自行编码
        response.setHeader("Content-Disposition", "attachment;filename=product.xls");
        ServletOutputStream out = response.getOutputStream();
        writer.flush(out, true);
        // 关闭 writer，释放内存
        writer.close();
        // 此处记得关闭输出 Servlet 流
        IoUtil.close(System.out);
        return Result.success();
    }

    /**
     * excel 批量导入商品
     *
     * @param file excel 文件
     * @return 成功
     * @throws IOException IO 异常
     */
    @PostMapping("/impReport")
    private Result impReport(MultipartFile file) throws IOException {
        System.out.println("..........");
        List<Product> infoList = ExcelUtil.getReader(file.getInputStream()).readAll(Product.class);
        if (!CollectionUtil.isEmpty(infoList)) {
            for (Product product : infoList) {
                try {
                    productService.addProduct(product);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return Result.success();
    }
}
